//配置路由的地方
import Vue from "vue";
import VueRouter from "vue-router";
//使用插件
Vue.use(VueRouter);

import routes from "./routes";
import store from "@/store";

//备份一份VueRouter原型的push
let originPush = VueRouter.prototype.push;

//重写push、replace
//第一个参数：location:告诉原来push的方法，你往哪里跳转（传递那些参数）
//第二个参数：resolve：成功的回调
//第三个参数：reject：失败的回调
    VueRouter.prototype.push = function(location,resolve,reject){
        if(resolve && reject){
            //call与apply异同：
            //相同点：都可以调用函数一次，都可以篡改上下文一次
            //不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
            originPush.call(this,location,resolve,reject)
        }else{
            originPush.call(this,location,()=>{},()=>{})
        }
    }
    VueRouter.prototype.replace = function(location,resolve,reject){
        if(resolve && reject){
            originReplace.call(this,location,resolve,reject)
        }else{
            originReplace.call(this,location,()=>{},()=>{})
        }
    }

//配置路由
let router = new VueRouter({
    //配置路由
    //由于KV一致所以可简写为routes
    //原型为routes:routes
    routes,
    //滚动行为
    scrollBehavior (to, from, savedPosition) {
        return {y:0}
    }
})
//全局守卫：前置守卫(在路由跳转前)
router.beforeEach(async(to,from,next)=>{
    //to:可以获取到你要跳转到那个路由的信息
    //from:可以获取到你从那个路由来的信息
    //next：放行函数  next()放行  next(path)放行到指定路由
    //用户登录了才会有token
    let token = store.state.users.token
    let name = store.state.users.userInfo.name
    //用户已经登录
    if(token){
        //用户已经登录不能跳转到登录
        if(to.path=='/login'||to.path=='/register'){
            next('/home')
        }else{
            //登录，去的不是login
            if(name){
                next()
            }else{
                //没有用户信息,派发action让仓库储存的用户信息跳转
              try {
                //获取用户信息成功
                await  store.dispatch('getUserInfo')
                next()
              } catch (error) {
                //token失效,获取不了用户信息
                //清除token
                await store.dispatch('userLogout')
                next('/')
              }
            }
        }
    }else{
        //未登录,不能去trade，pay，paysuccess，center页面所以应该去登录界面
        let toPath =to.path
        if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1 || toPath.indexOf('/center')!=-1){
            next('/login?redirect='+toPath)
        }else{
            //放行：home，detail，shopcart。。。。
            next()
        }
    }
})


export default router;